package Q4_07_Build_Order.DFS;
import java.util.ArrayList;
import java.util.Stack;
public class Question {
/* Build the graph, adding the edge (a, b) if b is dependent on a.
* Assumes a pair is listed in “build order” (which is the reverse
* of dependency order). The pair (a, b) in dependencies indicates
* that b depends on a and a must be built before a. */
public static Graph buildGraph(String[] projects, String[][] dependencies) {
Graph graph = new Graph();
for (String project : projects) {
graph.getOrCreateNode(project);
}
for (String[] dependency : dependencies) {
String first = dependency[0];
String second = dependency[1];
graph.addEdge(first, second);
}
return graph;
}
public static boolean doDFS(Project project, Stack<Project> stack) {
if (project.getState() == Project.State.PARTIAL) {
return false; // Cycle
}
if (project.getState() == Project.State.BLANK) {
project.setState(Project.State.PARTIAL);
ArrayList<Project> children = project.getChildren();
for (Project child : children) {
if (!doDFS(child, stack)) {
return false;
}
}
project.setState(Project.State.COMPLETE);
stack.push(project);
}
return true;
}
public static Stack<Project> orderProjects(ArrayList<Project> projects) {
Stack<Project> stack = new Stack<Project>();
for (Project project : projects) {
if (project.getState() == Project.State.BLANK) {
if (!doDFS(project, stack)) {
return null;
}
}
}
return stack;
}
public static String[] convertToStringList(Stack<Project> projects) {
String[] buildOrder = new String[projects.size()];
for (int i = 0; i < buildOrder.length; i++) {
buildOrder[i] = projects.pop().getName();
}
return buildOrder;
}
public static Stack<Project> findBuildOrder(String[] projects, String[][] dependencies) {
Graph graph = buildGraph(projects, dependencies);
return orderProjects(graph.getNodes());
}
public static String[] buildOrderWrapper(String[] projects, String[][] dependencies) {
Stack<Project> buildOrder = findBuildOrder(projects, dependencies);
if (buildOrder == null) return null;
String[] buildOrderString = convertToStringList(buildOrder);
return buildOrderString;
}
public static void main(String[] args) {
String[] projects = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
String[][] dependencies = {
{"a", "b"},
{"b", "c"},
{"a", "c"},
{"d", "e"},
{"b", "d"},
{"e", "f"},
{"a", "f"},
{"h", "i"},
{"h", "j"},
{"i", "j"},
{"g", "j"}};
String[] buildOrder = buildOrderWrapper(projects, dependencies);
if (buildOrder == null) {
System.out.println("Circular Dependency.");
} else {
for (String s : buildOrder) {
System.out.println(s);
}
}
}
}